package server;


import java.io.*;
import java.net.*;



public class SocketClientHandler extends Thread {
	private String s1;
	private String s2;
	private String s3;
	private String nome=null;
	private String stringaout;
	private int clientID=8;//=Gioco.getInstance().getGiocatoriInGioco().size();
	boolean primo=false;
	Socket socket;
	boolean game=true;

	
	public SocketClientHandler(Socket socket){this.socket=socket;}
	
	public void run(){
		try{
			
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while(game==true){
				
				if(nome!=null&&primo==true){
					for (int i=0;i<Gioco.getInstance().getGiocatoriInGioco().size();i++){
						if (Gioco.getInstance().getGiocatoriInGioco().get(i).getNome().equalsIgnoreCase(nome)){		
							clientID=i;
						}
					}
					if (Gioco.getInstance().getAbilitaTurno()[clientID].equalsIgnoreCase("eliminato"))
						Gioco.getInstance().setAbilitaTurno(null,clientID);
						stringaout="@eliminato";
						bufferedWriter.write(stringaout);
						bufferedWriter.newLine();
						bufferedWriter.flush();
					
					if (Gioco.getInstance().getAbilitaTurno()[clientID].equalsIgnoreCase("true"))
					Gioco.getInstance().setAbilitaTurno(null,clientID);
					stringaout="@cambioTurno,user="+Gioco.getInstance().getGiocatoriInGioco().get(Gioco.getInstance().getTurno()).getNome();
					bufferedWriter.write(stringaout);
					bufferedWriter.newLine();
					bufferedWriter.flush();
					
				}
				
				while(Gioco.getInstance().getAbilitaTurno()[clientID]==null){
					
					
					while(bufferedReader.ready()==true){
						String input = bufferedReader.readLine();
						for (int i=0;i<Gioco.getInstance().getGiocatoriInGioco().size();i++){
							if (Gioco.getInstance().getGiocatoriInGioco().get(i).getNome().equalsIgnoreCase(nome)){		
								clientID=i;
							}
						}
						int i=0;
						i=decodifica(input);
						switch (i){
						case 1://creaUtente
							
							stringaout=Gioco.getInstance().creaGiocatore(s1,s2);
							break;
						
						case 2://login
							
							nome=s1;
							stringaout=Gioco.getInstance().login(nome,s2);
							break;
						case 3://creaRazza
							primo=true;
							boolean tipologia=false;
							//System.out.println("S2:"+s2);
							if (s2.contains("c")) tipologia=true;
							stringaout=Gioco.getInstance().creaSpecie(nome,s1,tipologia);
							break;
							
						case 4://accessoPartita
							clientID=Gioco.getInstance().getGiocatoriInGioco().size();
							stringaout=Gioco.getInstance().entraInPartita(nome);
							break;
						case 5://uscitaPartita
							primo=false;
							clientID=8;
							stringaout=Gioco.getInstance().esciDallaPartita(nome);
							Gioco.getInstance().cambiaTurno();
							
							break;
						case 6://listaGiocatori
							stringaout=Gioco.getInstance().listaGiocatoriInGioco();
							break;
						case 7://classifica
							stringaout=Gioco.getInstance().classifica();
							break;
						case 8://logout
							stringaout=Gioco.getInstance().logout(nome);
							nome=null;
							break;
						case 9://mappaGenerale
							stringaout=Gioco.getInstance().mappaGenerale(nome);
							break;
						case 10://vistaGenerale
							stringaout=Gioco.getInstance().vistaGenerale(nome);
							break;
						case 11://muoviDinosauro
							stringaout=Gioco.getInstance().muoviDinosauro(s1, Integer.parseInt(s2), Integer.parseInt(s3),clientID);
							if(stringaout.contains("@finepartita")){
								primo=false;
								clientID=8;}
							Gioco.getInstance().cambiaTurno();
							break;
						case 12://cresciDinosauro
							stringaout=Gioco.getInstance().aumentaDimensione(s1,clientID);
							if(stringaout.contains("@finepartita")){
								primo=false;
								clientID=8;}
							Gioco.getInstance().cambiaTurno();
							break;
						case 13://deponiUovo
							stringaout=Gioco.getInstance().deponiUovo(s1,s2,clientID);
							if(stringaout.contains("@finepartita")){
								primo=false;
								clientID=8;}
							Gioco.getInstance().cambiaTurno();
							break;
						case 14://confermaTurno
							stringaout=Gioco.getInstance().confermaTurno();
							break;
						case 15://passaTurno
							stringaout=Gioco.getInstance().passaTurno();
							Gioco.getInstance().cambiaTurno();
							break;
						case 16://cambiaTurno
							//stringaout=Gioco.getInstance().cambiaTurno();
							break;
						case 17://infoGiocatore
							stringaout=Gioco.getInstance().infoGiocatore(s1);
							//if (primo==true) primo=false;
							//else	Gioco.getInstance().cambiaTurno();
							break;
						case 18://infoTurno
							stringaout=Gioco.getInstance().infoTurno();
							break;
						case 19://esci dal gioco
							stringaout="@Ok";
							game=false;
							break;
						default:
							stringaout="@errore";
							break;
					}
					bufferedWriter.write("s1:" +s1+" s2:"+s2+" s3:"+s3);
					bufferedWriter.write(stringaout);
					bufferedWriter.newLine();
					bufferedWriter.flush();
				}
			}
		}
	}
		catch(IOException e){e.printStackTrace();}
	}
	
	
	//@ requires	input!=null;
	//@ ensures ((/result>0 && /result<19)|| /result==-1)
	//@ (*/result == caso relativo*);
	/** Metodo utile per stanziare il case da invocare nello switch
	 * @param input
	 * @return
	 */
	private int decodifica(String input){
		int i=-1;
		String[] temp1,temp2;
		s1=null;
		s2=null;
		s3=null;
		if(input.contains("@creaUtente")) i=1;
		if(input.contains("@login")) i=2;
		if(input.contains("@creaRazza")) i=3;
		if(input.contains("@accessoPartita")) i=4;
		if(input.contains("@uscitaPartita")) i=5;
		if(input.contains("@listaGiocatori")) i=6;
		if(input.contains("@classifica")) i=7;
		if(input.contains("@logout")) i=8;
		if(input.contains("@mappaGenerale")) i=9;
		if(input.contains("@vistaGenerale")) i=10;
		if(input.contains("@muoviDinosauro")) i=11;
		if(input.contains("@cresciDinosauro")) i=12;
		if(input.contains("@deponiUovo")) i=13;
		if(input.contains("@confermaTurno")) i=14;
		if(input.contains("@passaTurno")) i=15;
		if(input.contains("@cambioTurno")) i=16;
		if(input.contains("@infoGiocatore")) i=17;
		if(input.contains("@infoTurno")) i=18;
		if(input.contains("@esciGioco")) i=19;
		
		if ((i>0 && i<4) || (i>10 &&i<14)||(i==17))
		{
			temp1=input.split(",");
			temp2=temp1[1].split("=");
			s1=temp2[1];
			
			if ((i>0 && i<4) || (i==11)||(i==13))
			{
				temp2=temp1[2].split("=");
				s2=temp2[1];
				
				if (i==11){
					int lunghezza;
					lunghezza=s2.length();
					s2=s2.substring(1,lunghezza);
					lunghezza=temp1[3].length();
					s3=temp1[3].substring(0,lunghezza-1);
				}
			}
		}
		return i;
	}
}


